package com.carrental.search.service;


import com.carrental.common.api.PageResult;
import com.carrental.search.model.document.VehicleDocument;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 车辆搜索服务接口
 * 提供车辆相关的搜索功能
 */
public interface VehicleSearchService {

    /**
     * 保存车辆文档
     *
     * @param vehicleDocument 车辆文档
     * @return 保存的车辆文档
     */
    VehicleDocument saveVehicle(VehicleDocument vehicleDocument);

    /**
     * 批量保存车辆文档
     *
     * @param vehicleDocuments 车辆文档列表
     * @return 保存的车辆文档列表
     */
    Iterable<VehicleDocument> saveVehicles(List<VehicleDocument> vehicleDocuments);

    /**
     * 根据ID获取车辆文档
     *
     * @param id 车辆ID
     * @return 车辆文档
     */
    VehicleDocument getVehicleById(Long id);

    /**
     * 根据ID删除车辆文档
     *
     * @param id 车辆ID
     */
    void deleteVehicleById(Long id);

    /**
     * 搜索车辆
     *
     * @param keyword  关键词
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @return 分页车辆文档
     */
    com.carrental.common.api.PageResult<VehicleDocument> searchVehicles(String keyword, int pageNum, int pageSize);

    /**
     * 高级搜索车辆
     *
     * @param params   搜索参数
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @return 分页车辆文档
     */
    PageResult<VehicleDocument> advancedSearchVehicles(Map<String, Object> params, int pageNum, int pageSize);

    /**
     * 根据品牌搜索车辆
     *
     * @param brand    品牌
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @return 分页车辆文档
     */
    com.carrental.common.api.PageResult<VehicleDocument> searchVehiclesByBrand(String brand, int pageNum, int pageSize);

    /**
     * 根据类型搜索车辆
     *
     * @param type     类型
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @return 分页车辆文档
     */
    com.carrental.common.api.PageResult<VehicleDocument> searchVehiclesByType(String type, int pageNum, int pageSize);

    /**
     * 根据价格范围搜索车辆
     *
     * @param minPrice 最小价格
     * @param maxPrice 最大价格
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @return 分页车辆文档
     */
    com.carrental.common.api.PageResult<VehicleDocument> searchVehiclesByPriceRange(BigDecimal minPrice, BigDecimal maxPrice, int pageNum, int pageSize);

    /**
     * 根据位置搜索附近的车辆
     *
     * @param latitude  纬度
     * @param longitude 经度
     * @param distance  距离（公里）
     * @param pageNum   页码
     * @param pageSize  每页大小
     * @return 分页车辆文档
     */
    com.carrental.common.api.PageResult<VehicleDocument> searchVehiclesByLocation(double latitude, double longitude, double distance, int pageNum, int pageSize);

    /**
     * 获取推荐车辆
     *
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @return 分页车辆文档
     */
    com.carrental.common.api.PageResult<VehicleDocument> getRecommendedVehicles(int pageNum, int pageSize);

    /**
     * 获取热门车辆（基于租赁次数）
     *
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @return 分页车辆文档
     */
    com.carrental.common.api.PageResult<VehicleDocument> getHotVehicles(int pageNum, int pageSize);

    /**
     * 获取高评分车辆
     *
     * @param minRating 最小评分
     * @param pageNum   页码
     * @param pageSize  每页大小
     * @return 分页车辆文档
     */
    com.carrental.common.api.PageResult<VehicleDocument> getHighRatedVehicles(Float minRating, int pageNum, int pageSize);

    /**
     * 获取最新上架的车辆
     *
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @return 分页车辆文档
     */
    com.carrental.common.api.PageResult<VehicleDocument> getNewestVehicles(int pageNum, int pageSize);

    /**
     * 更新车辆状态
     *
     * @param id     车辆ID
     * @param status 状态
     * @return 更新后的车辆文档
     */
    VehicleDocument updateVehicleStatus(Long id, Integer status);

    /**
     * 增加车辆浏览次数
     *
     * @param id 车辆ID
     * @return 是否成功
     */
    boolean incrementViewCount(Long id);
} 